package com.liuqianfei.markdown;

/**
 * markdown对应html标签装饰
 * 
 */
public interface Decorator
{
    /**
     * 段落开始标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;p&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openParagraph(final StringBuilder out);

    /**
     * 段落结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/p&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeParagraph(final StringBuilder out);

    /**
     * 引用开始标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;blockquote&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openBlockquote(final StringBuilder out);

    /**
     * 引用结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/blockquote&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeBlockquote(final StringBuilder out);

    /**
     * 多行代码块开始标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;pre&gt;&lt;code&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openCodeBlock(final StringBuilder out);

    /**
     * 多行代码块结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/code&gt;&lt;/pre&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeCodeBlock(final StringBuilder out);

    /**
     * 单行代码块开始标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;code&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openCodeSpan(final StringBuilder out);

    /**
     * 单行代码块结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/code&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeCodeSpan(final StringBuilder out);

    /**
     * 标题开始标签。
     *
     * <p>
     * <strong>注意：</strong>不要闭合HTML标签！
     * </p>
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;h");
     * out.append(level);</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     * @param level level级标题
     */
    public void openHeadline(final StringBuilder out, int level);

    /**
     * 标题结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code> out.append("&lt;/h");
     * out.append(level);
     * out.append("&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     * @param level level级标题
     */
    public void closeHeadline(final StringBuilder out, int level);

    /**
     * 加粗开始标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;strong&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openStrong(final StringBuilder out);

    /**
     * 加粗结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/strong&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeStrong(final StringBuilder out);

    /**
     * 强调标签开始。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;em&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openEmphasis(final StringBuilder out);

    /**
     * 强调标签结束。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/em&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeEmphasis(final StringBuilder out);

    /**
     * 上标开始标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;sup&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openSuper(final StringBuilder out);

    /**
     * 上标结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/sup&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeSuper(final StringBuilder out);

    /**
     * 有序列表开始标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;ol&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openOrderedList(final StringBuilder out);

    /**
     * 有序列表结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/ol&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeOrderedList(final StringBuilder out);

    /**
     * 无序列表开始标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;ul&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openUnorderedList(final StringBuilder out);

    /**
     * 无序列表结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/ul&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeUnorderedList(final StringBuilder out);

    /**
     * 列表开始标签。
     *
     * <p>
     * <strong>注意：</strong>不要闭合HTML标签！
     * </p>
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;li");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openListItem(final StringBuilder out);

    /**
     * 列表结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/li&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeListItem(final StringBuilder out);

    /**
     * 水平分割线标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;hr /&gt;\n");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void horizontalRuler(final StringBuilder out);

    /**
     * 链接开始标签。
     *
     * <p>
     * <strong>注意：</strong>不要闭合HTML标签！
     * </p>
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;a");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openLink(final StringBuilder out);

    /**
     * 链接结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/a&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeLink(final StringBuilder out);

    /**
     * 图像开始标签。
     *
     * <p>
     * <strong>注意：</strong>不要闭合HTML标签！
     * </p>
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;img");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openImage(final StringBuilder out);

    /**
     * 图像结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append(" /&gt;");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeImage(final StringBuilder out);
    
    /**
     * 删除线开始标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;s>");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void openStrike(final StringBuilder out);

    /**
     * 删除线结束标签。
     *
     * <p>
     * 默认实现为：
     * </p>
     *
     * <pre>
     * <code>out.append("&lt;/s>");</code>
     * </pre>
     *
     * @param out 输出的StringBuilder
     */
    public void closeStrike(final StringBuilder out);
}
